package com.bdqn.qnnews.article.controller.v1;

import com.bdqn.qnnews.articel.api.dto.ApArticleDto;
import com.bdqn.qnnews.article.convert.ApArticleConvert;
import com.bdqn.qnnews.article.entity.ApArticle;
import com.bdqn.qnnews.article.service.ApArticleService;
import com.bdqn.qnnews.article.vo.ArticleVo;
import com.bdqn.qnnews.common.base.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * @author xlz
 * @since 2023-12-22
 * @description 文章信息表，存储已发布的文章
 */
@Slf4j
@RestController
@RequestMapping("/api/v1/article")
@Tag(name = "文章信息表，存储已发布的文章控制器类",
        description = "ApArticleController 文章信息表，存储已发布的文章 后端数据接口")
public class ApArticleController {
    @Autowired
    private ApArticleService apArticleService;

    /**
     * 查询所有 app文章列表数据
     * @return
     */
    @Operation(summary = "查询所有文章列表数据")
    @GetMapping("/all")
    public R<List<ApArticleDto>> findAllArticles(){
        // 一般建议是1000-5000个文档，如果你的文档很大，可以适当减少队列，大小建议是5-15MB，默认不能超过100M
        // TODO 如果数据库数据过多 建议分段批量插入
        // 查询所有文章列表数据
        final List<ApArticle> articles = apArticleService.list();
        // 数据转换
        final ArrayList<ApArticleDto> apArticleDtos = new ArrayList<>();

        for (ApArticle article : articles) {
            apArticleDtos.add(ApArticleConvert.INSTANCE.entityToDto(article));
        }
        return R.ok(apArticleDtos);
    }

    /**
     * 保存或更新文章
     * @param dto 文章数据
     * @return 统一响应对象
     */
    @Operation(summary = "保存或更新App文章",description = "没有文章id就是保存，有id就是更新")
    @PostMapping("/save")
    public R<Long> saveAndUpdate(@RequestBody ApArticleDto dto){
        // 获取返回的文章id
        Long id = apArticleService.saveAndUpdateArticle(dto);
        // 生成静态页

        return R.ok(id);
    }

    /**
     * 首页文章
     */
    @Operation(summary = "首页文章",description = "相当于上拉加载，小于传入的日期")
    @PostMapping("/load")
    public R<List<ApArticle>> load(@RequestBody ArticleVo avo){
        log.debug("--首页文章参数：{}",avo);
        // 1 代表上拉 (条件是小于传入的最小日期值)
        final List<ApArticle> apArticles = apArticleService.loadApArticle(avo, 1);

        return R.ok(apArticles);
    }

    /**
     * 更多文章
     */
    @Operation(summary = "更多文章",description = "上拉加载更多文章，比当前最后一条文章日期小的数据")
    @PostMapping("/loadmore")
    public R<List<ApArticle>> loadmore(@RequestBody ArticleVo avo){
        //1 代表上拉(小于判断)
        final List<ApArticle> apArticles = apArticleService.loadApArticle(avo, 1);

        return R.ok(apArticles);
    }

    /**
     * 更新文章
     */
    @Operation(summary = "更新文章",description = "下拉更新文章，加载比当前最新文章日期大的数据")
    @PostMapping("/loadnew")
    public R<List<ApArticle>> loadnew(@RequestBody ArticleVo avo){
        //2 代表下拉（大于判断）
        final List<ApArticle> apArticles = apArticleService.loadApArticle(avo, 2);
        return R.ok(apArticles);
    }


    /**
     * 通过id查询 文章信息表，存储已发布的文章
     * @param id id
     * @return Result
     */
    @Operation(summary = "通过id查询", description = "通过id查询")
    @GetMapping("/{id}")
    public R<ApArticle> getById(@PathVariable("id") Long id) {
        final ApArticle article = apArticleService.getById(id);
        return R.ok(article);
    }

}
